package com.zenithmind.exam.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zenithmind.exam.pojo.entity.ExamCategory;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 考试分类Mapper接口
 * 
 * @author ZenithMind
 * @since 2024-07-01
 */
@Mapper
public interface ExamCategoryMapper extends BaseMapper<ExamCategory> {

    /**
     * 根据父分类ID查询子分类列表
     * 
     * @param parentId 父分类ID
     * @return 子分类列表
     */
    @Select("SELECT * FROM exam_category WHERE parent_id = #{parentId} AND is_deleted = 0 ORDER BY sort_order ASC")
    List<ExamCategory> selectByParentId(@Param("parentId") String parentId);

    /**
     * 查询根分类列表
     * 
     * @return 根分类列表
     */
    @Select("SELECT * FROM exam_category WHERE parent_id IS NULL AND is_deleted = 0 ORDER BY sort_order ASC")
    List<ExamCategory> selectRootCategories();

    /**
     * 根据层级查询分类列表
     * 
     * @param level 层级
     * @return 分类列表
     */
    @Select("SELECT * FROM exam_category WHERE level = #{level} AND is_deleted = 0 ORDER BY sort_order ASC")
    List<ExamCategory> selectByLevel(@Param("level") Integer level);

    /**
     * 查询启用状态的分类列表
     * 
     * @return 启用状态的分类列表
     */
    @Select("SELECT * FROM exam_category WHERE status = 1 AND is_deleted = 0 ORDER BY sort_order ASC")
    List<ExamCategory> selectEnabledCategories();

    /**
     * 分页查询分类列表
     * 
     * @param page 分页参数
     * @param name 分类名称（模糊查询）
     * @param status 状态
     * @param parentId 父分类ID
     * @return 分页结果
     */
    IPage<ExamCategory> selectCategoryPage(Page<ExamCategory> page, 
                                          @Param("name") String name,
                                          @Param("status") Integer status,
                                          @Param("parentId") String parentId);

    /**
     * 统计子分类数量
     * 
     * @param parentId 父分类ID
     * @return 子分类数量
     */
    @Select("SELECT COUNT(*) FROM exam_category WHERE parent_id = #{parentId} AND is_deleted = 0")
    Integer countByParentId(@Param("parentId") String parentId);

    /**
     * 查询分类树结构
     * 
     * @return 分类树列表
     */
    List<ExamCategory> selectCategoryTree();
}
